package com.lanou3g.bookstore.util.upload;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.lang3.StringUtils;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created by dllo on 18/5/15.
 */

/**
 * 本次封装需要 new 出对象 传进HttpServlet 也就是传来一个this即可
 * 调用parse方法传进request才可以上传文件
 * 在那个servlet里不需要获取任何东西
 * 直接new对象...
 */
public class Upload {
    private HttpServlet servlet;//传进来当前servlet对象
    private ServletFileUpload sfu;//用于上传的对象
    private File uploadDir;//存储位置,在哪个文件夹下
    //用于存储普通表单的数据,通过表单名获取
    private HashMap<String, String> parameters;
    //用于存储上传的文件,通过文件名获取
    private HashMap<String, File> files;
    //用于存储文件名,通过表单名获取
    private HashMap<String, String> fileNames;

    private void initDir() {
        String uploadPath = servlet.getServletContext().getRealPath("")
                + File.separator + "book_img";
        uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdirs();//不存在则创建该文件夹
        }
    }

    //构造方法,用来初始化变量
    public Upload(HttpServlet servlet) {
        this.servlet = servlet;//传入当前servlet
        initDir();//初始化文件夹
        //初始化上传文件用的对象
        sfu = new ServletFileUpload();
        sfu.setFileItemFactory(new DiskFileItemFactory());
        //初始化两个存储工具
        parameters = new HashMap<>();
        files = new HashMap<>();
        fileNames = new HashMap<>();

    }

    public void parse(HttpServletRequest request) {
        try {
            List<FileItem> fileItems = sfu.parseRequest(request);
            if (fileItems != null) {
                for (FileItem fileItem : fileItems) {
                    if (fileItem.isFormField()) {
                        //普通表单
                        String key = fileItem.getFieldName();//表单name
                        String value = fileItem.getString("utf8");//表单内容
                        parameters.put(key, value);
                    } else {
                        //要上传的文件
                        String name = fileItem.getFieldName();
                        String fileName = fileItem.getName();//文件名
                        fileNames.put(name, fileName);
                        //空文件时不至于崩溃,引包lang3
                        if (StringUtils.isEmpty(fileName)) {
                            continue;
                        }
                        String realName = UU.getLoadName(fileName);//给文件起个随机名
                        File file = new File(uploadDir, fileName);//文件夹下文件名
                        fileItem.write(file);//开始上传文件
                        files.put(fileName, file);//将文件存储起来
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //以下是获取访问结果的值或文件
    public String getParameter(String key) {
        return parameters.get(key);//拿到key对应的value
    }

    public Map<String, String> getParameterMap() {
        return parameters;//拿到所有的普通数据
    }

    public Map<String, File> getUploadFiles() {
        return files;//拿到所有的上传文件
    }

    public File getFile(String key) {
        return files.get(key);//通过文件名获取文件
    }

    public String getFileName(String key) {
        return fileNames.get(key);
    }

    public Map<String, String> getFileNames() {
        return fileNames;
    }
}
